package com.xuecheng.media.service.impl;

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.vod.model.v20170321.GetPlayInfoResponse;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xuecheng.api.content.model.dto.CourseBaseDTO;
import com.xuecheng.api.media.model.dto.MediaDTO;
import com.xuecheng.common.domain.code.CommonErrorCode;
import com.xuecheng.common.domain.page.PageRequestParams;
import com.xuecheng.common.domain.page.PageVO;
import com.xuecheng.common.enums.common.AuditEnum;
import com.xuecheng.common.exception.ExceptionCast;
import com.xuecheng.common.util.StringUtil;
import com.xuecheng.media.common.constant.MediaErrorCode;
import com.xuecheng.media.common.utils.AliyunVODUtil;
import com.xuecheng.media.convert.MediaConvert;
import com.xuecheng.media.entity.Media;
import com.xuecheng.media.mapper.MediaMapper;
import com.xuecheng.media.service.AliyunVodService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;

import java.util.Collections;
import java.util.List;

/**
 * @author by 高鹏
 * @Date 2021/12/14
 * @Description
 */
@Slf4j
@Service
public class AliyunVodServiceImpl extends ServiceImpl<MediaMapper, Media> implements AliyunVodService {

    @Value("${aliyun.region}")
    private  String region;
    @Value("${aliyun.accessKeyId}")
    private  String accessKeyId;
    @Value("${aliyun.accessKeySecret}")
    private  String accessKeySecret;

    @Autowired
    private FeignClient feignClient;

    /**
     * 保存媒资信息
     * 业务分析
     *     1.判断关键
     *         companyid  filename  fileid(videoId)
     *     2.给信息数据赋值默认值
     *         auditStatus：未审核
     *     3.保存信息
     *     4.将数据库最新数据返回
     *
     *
     * @param mediaDTO
     * @param companyId
     * @return
     */
    @Override
    public MediaDTO createMedia(MediaDTO mediaDTO, Long companyId) {
        //1.判断关键
        //     companyid  filename  fileid(videoId)
        if (ObjectUtils.isEmpty(companyId)||
                StringUtil.isBlank(mediaDTO.getFilename())||
                StringUtil.isBlank(mediaDTO.getFileId())
        ) {
            ExceptionCast.cast(CommonErrorCode.E_100101);
        }

        // 2.给信息数据赋值默认值
        //     auditStatus：未审核
        mediaDTO.setAuditStatus(AuditEnum.AUDIT_UNPAST_STATUS.getCode());
        mediaDTO.setCompanyId(companyId);

        // 3.保存信息
        Media media = MediaConvert.INSTANCE.dto2entity(mediaDTO);
        boolean result = this.save(media);

        if (!result) {
            ExceptionCast.cast(MediaErrorCode.E_140001);
        }

        // 4.将数据库最新数据返回
        Media po = this.getById(media.getId());
        MediaDTO resultDTO = MediaConvert.INSTANCE.entity2dto(po);

        return resultDTO;
    }

    @Override
    public PageVO queryMediaVodList(PageRequestParams params, MediaDTO mediaDTO) {
        // 1.判断关键数据
        // 分页数据的合法性
        if (params.getPageNo() < 1) {
            params.setPageNo(PageRequestParams.DEFAULT_PAGE_NUM);
        }

        if (params.getPageSize() < 1) {
            params.setPageSize(PageRequestParams.DEFAULT_PAGE_SIZE);
        }


        // 2.构建分页对象
        Page<Media> basePage = new Page<>(params.getPageNo(),params.getPageSize());

        // 3.构建查询条件对象
        LambdaQueryWrapper<Media> queryWrapper = new LambdaQueryWrapper<>();

        // 课程名称     like   完整版
        // 课程审核状态  eq
        // String courseName = model.getCourseName();
        // if (StringUtil.isNotBlank(courseName)) {
        //     queryWrapper.like(CourseBase::getName, courseName);
        // }
        //
        // String auditStatus = model.getAuditStatus();
        // if (StringUtil.isNotBlank(auditStatus)) {
        //     queryWrapper.eq(CourseBase::getAuditStatus, auditStatus);
        // }

        // 简写版
        queryWrapper.like(StringUtil.isNotBlank(mediaDTO.getFilename()),Media::getFilename, mediaDTO.getFilename());
        queryWrapper.eq(StringUtil.isNotBlank(mediaDTO.getType()),Media::getType, mediaDTO.getType());


        // 4.查询数据内容获得结果
        Page<Media> page = this.page(basePage, queryWrapper);

        List<Media> records = page.getRecords();
        long total = page.getTotal();


        List<MediaDTO> dtos = Collections.emptyList();

        if (!(CollectionUtils.isEmpty(records))) {
            dtos = MediaConvert.INSTANCE.entitys2dtos(records);
        }

        // 5.构建返回结果数据-PageVo
        PageVO pageVO = new PageVO(dtos,total,params.getPageNo(),params.getPageSize());

        return pageVO;
    }


    @Override
    public String getVODUrl(Long mediaId, Long companyId) {
        // 1.判断业务数据
        if (ObjectUtils.isEmpty(mediaId)) {
            ExceptionCast.cast(CommonErrorCode.E_100101);
        }
        // 2.根据媒资id获得媒资信息
        Media media = getById(mediaId);
        if (ObjectUtils.isEmpty(media)) {
            ExceptionCast.cast(CommonErrorCode.E_100104);
        }

        // 3.如果公司id不为空，对其进行判断
        if (!(ObjectUtils.isEmpty(companyId))) {
            if (!(ObjectUtils.nullSafeEquals(media.getCompanyId(), companyId))) {
                ExceptionCast.cast(CommonErrorCode.E_100108);
            }
        }

        String playUrl = getPlayUrl(media.getFileId());


        // 4.返回媒资的资源地址
        return playUrl;

    }

    /**
     * 业务分析：
     * 	1.判断关键数据
     * 		mediaId、companyId
     * 	2.判断业务数据
     * 		媒资信息
     * 		判断是否存在
     * 			判断审核状态：只有审核通过不能删除
     * 		判断媒资信息是否有绑定课程计划数据
     * 			绑定媒资和课程计划数据：content（发送feign）
     * 										   teachplan_media
     * 	3.删除媒资信息
     * 	媒资服务中的数据：Media
     * 		阿里云对应的视频
     * @param mediaId
     * @param companyId
     * @return
     */
    @Override
    public Boolean deleteMedia(Long mediaId, Long companyId) {
        if (ObjectUtils.isEmpty(mediaId)||ObjectUtils.isEmpty(companyId)) {
            ExceptionCast.cast(CommonErrorCode.E_100101);
        }
        
        
        

        LambdaQueryWrapper<Media> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Media::getId, mediaId);
        queryWrapper.eq(Media::getCompanyId, companyId);
        Media media = this.getOne(queryWrapper);
        if (ObjectUtils.isEmpty(media)) {
            ExceptionCast.cast(CommonErrorCode.E_100104);
        }

        if (media.getAuditStatus().equals(AuditEnum.AUDIT_PASTED_STATUS.getCode())) {
            ExceptionCast.cast(CommonErrorCode.E_100106);
        }

        // 判断媒资信息是否有绑定课程计划数据
        // 			绑定媒资和课程计划数据：content（发送feign）
        // 								teachplan_media
//        feignClient.deleteMedia(media);


        boolean result = this.removeById(mediaId);

        return result;

    }

    private String getPlayUrl(String videoId) {

        String playUrl = "";
        try {

            DefaultAcsClient client =
                    AliyunVODUtil.initVodClient(region,accessKeyId,accessKeySecret);

            GetPlayInfoResponse response = AliyunVODUtil.getPlayInfo(client,videoId);

            List<GetPlayInfoResponse.PlayInfo> playInfoList = response.getPlayInfoList();

            if (!(ObjectUtils.isEmpty(playInfoList))) {
                GetPlayInfoResponse.PlayInfo playInfo = playInfoList.get(0);
                playUrl = playInfo.getPlayURL();
            }

        } catch (Exception e) {
            ExceptionCast.cast(MediaErrorCode.E_140014);
        }
        return playUrl;
    }




}
